package com.gmgx.controller;

import com.gmgx.utils.FileTransferUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Controller
@RequestMapping("uploadAndDownload")
public class UploadAndDownloadController {
    @Autowired
    private FileTransferUtil fileTransferUtil;

    @RequestMapping("upload")
    public ModelAndView upload(String sname, MultipartFile photo, HttpServletRequest request){
        ModelAndView mv = new ModelAndView();

        // 得到 原始的文件名（上传文件的 原名）
        String oldFileName = photo.getOriginalFilename();
        // 获得它的后缀
        String suffix = oldFileName.substring(oldFileName.lastIndexOf("."));
        // 获得一个 32位随机数   去掉它的间隔 -
        // 生成一个新名字
        String newFileName = UUID.randomUUID().toString().replaceAll("-", "") + suffix;
        System.out.println(newFileName);
        // 1 如果 将 上传文件锁定在某个固定位置，比如当前电脑的D盘 upload文件夹
        //File pathFile = new File("D://upload"); 直接写死了
        // 2 获取当前工程的所在位置的某个文件的真实路径
        String path = request.getServletContext().getRealPath("/upload");
        System.out.println(path);
        // 由该文件路径创建一个File对象，这个文件只是虚拟的，还没真到硬件呢
        File pathFile = new File(path);
        // 如果路径不存在就新建
        if (!pathFile.exists()){
            pathFile.mkdirs();
        }
        // 拼接好 全路径（路径+文件名）
        //  `/` 与 `\` 都可以
        String newPath = pathFile + "/" + newFileName;
        // 提供了 转移 方法  将当前上传的文件（在内存中） 转移到 指定位置（硬盘中）
        try {
            //todo:笔记
            photo.transferTo(new File(newPath));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return mv;
    }

    // 多个文件的情况
    @RequestMapping("upload2")
    public ModelAndView upload2(String sname, MultipartFile photo, MultipartFile resume, HttpServletRequest request){
        ModelAndView mv = new ModelAndView();
        // 全流程：
        // 获取 原文件名，再得到后缀
        // UUID生成随机的字符，和后缀拼接得到新文件名
        // 判断如果本工程下不存在 upload 文件夹，就新建
        // 拼接好 文件要转去的位置的 全路径（路径+文件名）
        // 利用 MultipartFile 对象提供的的 transfer(File xxx) 方法 转存

        String path = request.getServletContext().getRealPath("/upload");
        System.out.println("转存至" + fileTransferUtil.transferFile(photo, path));
        System.out.println("转存至" + fileTransferUtil.transferFile(resume, path));
        //todo: 打印出现乱码

        return mv;
    }
}
